import numpy as np
from pandas import DataFrame

# 数据聚合(重点)
df = DataFrame({'color': ['red', 'white', 'red', 'cyan', 'cyan', 'green', 'white', 'cyan'],
                'price': np.random.randint(0, 8, size=8),
                'wight': np.random.randint(50, 55, size=8)})
print(df)
print(df.groupby(by='color').groups)  # 可使用groups属性查看个各行的分组情况
# 分组之后再进行聚合
## 先聚合再取值
print(df.groupby(by='color').sum()[['price']])
## 先取值再聚合，推荐快
print(df.groupby(by='color')[['price']].sum())
## 将聚合的产物加到最后一列
### 标准写法
print(df.merge(df.groupby(by='color')[['price']].sum(), left_on='color', right_index=True, suffixes=['', '_sum']))
### 使用transform()函数，使用transform的效率会比上面的方法快
df['price_sum'] = df.groupby('color')['price'].transform('sum')
print(df)
### transform()函数使用
""" https://zhuanlan.zhihu.com/p/111023378 """

"""
数据聚合的步骤：
1.分组，找到分组的列
2.聚合，执行觉和操作
3.合并，把聚合的结果合并到原始表中
"""

"""
练习：
假设菜市场张大妈在卖菜，有以下属性：
菜品（item）：萝卜、白菜、辣椒、冬瓜
颜色（color）：白、青、红
重量（weight）
价格（price）
1.要求以属性作为索引，新建一个df
2.对df进行聚合操作，求出颜色为白色的价格总和
3.对df进行聚合操作，求出萝卜的所有重量（包括白萝卜、胡萝卜、青萝卜）以及平均价格
4.使用merge合并总重量及平均价格
"""
df = DataFrame({'item': ['萝卜', '萝卜', '萝卜', '白菜', '白菜', '辣椒', '辣椒', '辣椒', '冬瓜', '冬瓜'],
                'color': ['白', '红', '青', '青', '白', '青', '红', '白', '青', '白'],
                'weight': [60, 70, 40, 50, 60, 100, 80, 20, 200, 150],
                'price': [2.68, 3.98, 4.98, 1.28, 1.58, 7.98, 8.88, 12.28, 1.28, 1.58]})
print(df.groupby(by='color')[['price']].sum().loc[['白', ]])
weight_sum = df.groupby(by='item')[['weight']].sum()
price_mean = df.groupby(by='item')[['price']].mean()
print(df.groupby(by='item').agg({'weight': 'sum', 'price': 'mean'}))  # 相当于做了上面的两步
df = df.merge(weight_sum, left_on='item', right_index=True, suffixes=('', '_sum'))
df = df.merge(price_mean, left_on='item', right_index=True, suffixes=('', '_mean'))
print(df)
# 补充：
# 使用add_prefix()函数,给Series的index名或DataFrame的columns名添加前缀
df = df.add_prefix('kfx_')
# 使用add_suffix()函数,给Series的index名或DataFrame的columns名添加后缀
df = df.add_suffix('_cty')
print(df)
